package com.naiterui.ehp.bp.support.utils;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.context.properties.bind.Binder;
import org.springframework.boot.env.EnvironmentPostProcessor;
import org.springframework.core.PriorityOrdered;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.Environment;
import org.springframework.core.env.PropertySource;

/**
 * <pre>
 *      读取系统配置文件工具类
 * </pre>
 *
 * @author 王泽浩
 * @date 2018/5/30 下午8:53
 * @since 1.0.0
 */
@SuppressWarnings("WeakerAccess")
public class SysConfigUtil implements EnvironmentPostProcessor, PriorityOrdered {

    static boolean flag = true;

    /**
     * 开发环境配置文件参数
     */
    public static final String PROFILE_DEV = "dev";

    /**
     * 测试环境配置文件参数
     */
    public static final String PROFILE_TEST = "test";

    /**
     * 正式环境配置文件参数
     */
    public static final String PROFILE_PRODUCT = "product";

    /**
     * 环境配置列表
     */
    protected static Environment environment;

    /**
     * 将对象从一个或多个绑定到一起的容器对象。
     */
    protected static Binder binder;

    public static Binder getBinder() {
        return binder;
    }

    /**
     * <pre>
     *      获取系统名称，这里获取配置文件中的spring.application.name 的配置
     * </pre>
     *
     * @return 系统名称
     */
    public static String getServerPrefix() {
        return environment.getProperty("spring.application.name", String.class);
    }

    /**
     * <pre>
     *     获取系统是否调试模式,如果开始dev环境，那么将启用调试模式。其余环境需要增加http请求参数校验
     * </pre>
     *
     * @return 如果是DEV，那么是调试模式
     */
    public static boolean getDebugMode() {
        Boolean debugMode = environment.getProperty("naiterui.config.debugMode", Boolean.class);
        boolean isProduct = environment.acceptsProfiles(PROFILE_PRODUCT);

        if (isProduct && Boolean.TRUE.equals(debugMode)) {

            // 生产环境不支持开启调试模式
            throw new UnsupportedOperationException("警告:生产环境配置不支持开启调试模式!请检查product配置文件[naiterui.config.debugMode]是否为true.");
        } else if (debugMode != null) {

            // 非生产环境以调试开关设置为准
            return debugMode;
        } else {

            // 未设置调试开关,默认开发环境开启调试
            return environment.acceptsProfiles(PROFILE_DEV);
        }

    }

    /**
     * 获取当前激活环境配置
     * SysConfigUtil.getActiveProfile()
     *
     * @return
     *
     * @Author guoyongxiang
     * @Date 2018年8月7日
     * @since 1.0.0
     */
    public static String getActiveProfile() {
        return environment.getActiveProfiles()[0];
    }

    /**
     * 获取swagger开关(正式环境始终返回false)
     * SysConfigUtil.getSwaggerSwitch()
     *
     * @return
     *
     * @Author guoyongxiang
     * @Date 2018年8月7日
     * @since 1.0.0
     */
    public static Boolean getSwaggerSwitch() {
        if (!SysConfigUtil.PROFILE_PRODUCT.equals(SysConfigUtil.getActiveProfile())) {
            Boolean enabled = environment.getProperty("swagger.enabled", Boolean.class);
            return enabled == null ? false : enabled;
        } else {
            return false;
        }
    }

    @Override
    public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {

        for (PropertySource<?> propertySource : environment.getPropertySources()) {
            if (propertySource.getName().equals("refreshArgs")) {
                return;
            }
        }
        SysConfigUtil.environment = environment;
        SysConfigUtil.binder = Binder.get(environment);
    }

    @Override
    public int getOrder() {
        return 10;
    }
}
